日期：2024/1/7 出题人：\href{https://github.com/Matrix-A}{Matrix-A}（\href{https://github.com/Mq-b/Loser-HomeWork/issues/159}{\#159}）\\

\begin{enumerate}
    \item 使用\textbf{表达式模板}补全下面的代码，实现表达式计算；
    \item 指出\textbf{表达式模板}和 STL Ranges 库中哪些\textbf{视图}类似，并指出它们的异同和优缺点。
\end{enumerate}

\begin{minted}[mathescape,	
    linenos,
    numbersep=5pt,
    gobble=2,
    frame=lines,
    framesep=2mm]{c++}
    #include <algorithm>
    #include <functional>
    #include <iostream>
    #include <ranges>
    #include <vector>

    // 为std::vector增加一个自定义的赋值函数
    template <typename T>
        requires std::disjunction_v<std::is_integral<T>, std::is_floating_point<T>>
    class vector : public std::vector<T> {
    public:
        using std::vector<T>::vector;
        using std::vector<T>::size;
        using std::vector<T>::operator[];
        template <typename E>
        vector<T>& operator=(const E& e)
        {
            const auto count = std::min(size(), e.size());
            this->resize(count);
            for (std::size_t idx { 0 }; idx < count; ++idx) {
                this->operator[](idx) = e[idx];
            }
            return *this;
        }
    };

    /*
    // 实现表达式模板类及相关函数
    template<...>
    struct vector_expr {

    };

    // operator+
    // operator-
    // operator*
    // operator/
    */

    int main()
    {
        auto print = [](const auto& v) {
            std::ranges::copy(v, std::ostream_iterator<std::ranges::range_value_t<decltype(v)>> { std::cout, ", " });
            std::cout << std::endl;
        };
        const vector<double> a { 1.2764, 1.3536, 1.2806, 1.9124, 1.8871, 1.7455 };
        const vector<double> b { 2.1258, 2.9679, 2.7635, 2.3796, 2.4820, 2.4195 };
        const vector<double> c { 3.9064, 3.7327, 3.4760, 3.5705, 3.8394, 3.8993 };
        const vector<double> d { 4.7337, 4.5371, 4.5517, 4.2110, 4.6760, 4.3139 };
        const vector<double> e { 5.2126, 5.1452, 5.8678, 5.1879, 5.8816, 5.6282 };

        {
            vector<double> result(6);
            for (std::size_t idx = 0; idx < 6; idx++) {
                result[idx] = a[idx] - b[idx] * c[idx] / d[idx] + e[idx];
            }
            print(result);
        }
        {
            vector<double> result(6);
            result = a - b * c / d + e; // 使用表达式模板计算
            print(result);
        }
        return 0;
    }
\end{minted}

\begin{tcolorbox}[title = {运行结果},
    fonttitle = \bfseries, fontupper = \sffamily, fontlower = \itshape]
    4.73472, 4.05709, 5.038, 5.08264, 5.73076, 5.18673,\\
    4.73472, 4.05709, 5.038, 5.08264, 5.73076, 5.18673,
\end{tcolorbox}

\begin{itemize}
    \item \textbf{难度}： 待定
\end{itemize}

学习链接：
\begin{itemize}
    \item \href{https://en.wikipedia.org/wiki/Expression_templates}{Wikipedia - Expression templates}
    \item \href{https://gieseanw.wordpress.com/2019/10/20/we-dont-need-no-stinking-expression-templates/}{我们不需要臭名昭著的表达式模板（英文）}
    \item \href{https://blog.csdn.net/magisu/article/details/12964911}{C++语言的表达式模板：表达式模板的入门性介绍}
    \item \href{https://zh.cppreference.com/w/cpp/numeric/valarray}{std::valarray} 在一些 STL 实现中使用了表达式模板
\end{itemize}